//
// Created by SN on 2020/1/11.
//

#include <stdio.h>


/**
 *
 * 数值在计算机中的存取方式
 * 存: 任何数据在计算机中存放的都是补码
 *
 * 原码: 数据本身的二进制
 *      eg: +15 0000 1111
 *          -15 1000 1111
 * 反码: 对于无符号数, 反码==原码
 *       对于有符号数, 正数, 反码==原码; 负数, 反码==符号位不变, 其他位取反
 *      eg: +15 原码: 0000 1111
 *              反码: 0000 1111
 *          -15 原码: 1000 1111
 *              反码: 1111 0000
 * 补码: 对于无符号数, 补码==原码
 *       对于有符号数, 正数, 补码==原码; 负数, 补码==取反+1
 *      eg: +15 原码: 0000 1111
 *              反码: 0000 1111
 *              补码: 0000 1111
 *          -15 原码: 1000 1111
 *              反码: 1111 0000
 *              补码: 1111 0001
 *
 * 取
 * 1. 有符号, 先看最高位是不是1, 是1表示该数是一个负数的补码, 符号位不变, 其他取反, +1
 *                             不是1, 表示该数是要给正数的补码, 补码==原码, 原样输出
 * 2. 无符号， 内存数据原样输出
 *
 */
int main() {

    char num = -15;
    //有符号输出
    printf("%d\n", num); //-15
    //无符号输出
    printf("%u\n", num&0x000000ff);


    char num1 = 0x9b;
    printf("%d\n", num1); //-101
    printf("%x\n", num1); //ffffff9b

    //数据溢出
    char num2 = 0xfe + 3;
    printf("%d\n", num2); //1
    printf("%#x\n", num2); //0x1


    return 0;
}